package ppal;

import genc.GenC;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;

import alex.AnalizadorLexico;
import alex.excepciones.ExcepcionLexica;
import asem.TablaSimbolos;
import asem.excepciones.ExcepcionSemantica;
import asem.tablaSimbolos.Clase;
import asin.AnalizadorSintactico;
import asin.excepciones.ExcepcionSintactica;

public class Principal {

	public static void main(String[] args) {
		try {
			GenC.gen.setArchEntrada(args[0]);
			if (args.length >= 2)
				GenC.gen.setArchSalida(args[1]);

			File arc = new File(args[0]);
			FileInputStream archivo = new FileInputStream(arc);

			AnalizadorLexico aLexico = new AnalizadorLexico(archivo);
			AnalizadorSintactico aSintactico = new AnalizadorSintactico(aLexico);

			aSintactico.analizar();

			GenC.gen.crear();
			TablaSimbolos.tabla.chequearSemantica();

			GenC.gen.cerrar();
			archivo.close();
			
			if (args.length >= 3) {
				FileWriter archivoSalida = new FileWriter(new File(args[2]));

				for (Clase c : TablaSimbolos.tabla.getClases().values()) {
					c.imprimirInfo(archivoSalida);
					archivoSalida.write("\n \n");
				}
				archivoSalida.close();
			}
			

		} catch (IOException e) {
			System.out.printf("Error al cargar o cerrar el archivo.");
		} catch (ExcepcionLexica l) {
			System.out.print(l.getMessage());
		} catch (ExcepcionSintactica s) {
			System.out.print(s.getMessage());
		} catch (ExcepcionSemantica s) {
			System.out.print(s.getMessage());
		}
	}
}